package org.example.netty.test.nio.bean;

import lombok.Data;

import java.io.Serializable;

/**
 * @author zp
 * @version 1.0
 * @description: 消息体
 * <p>
 * * +---------------------------------------------------------------+
 * * | 魔数 2byte | 协议版本号 1byte | 序列化算法 1byte | 报文类型 1byte  |
 * * +---------------------------------------------------------------+
 * * | 状态 1byte |      数据长度 4byte     |         数据内容 （长度不定）
 * * +---------------------------------------------------------------+
 * @date 2023/3/30 19:41
 */
@Data
public abstract class Message implements Serializable {
    protected static final byte[] LOGIN_TYPE = new byte[]{0};
    protected static final byte[] LOGOUT_TYPE = new byte[]{1};

    /**
     * @return int
     * @description: 返回消息类
     * @author zp
     * @date: 2023/3/30 19:42
     */
    public abstract byte[] messageType();

    /**
     * @return byte[]
     * @description: 获取消息状态
     * @author zp
     * @date: 2023/3/30 19:50
     */
    public abstract byte[] messageTypeStatus();

    /**
     * @return int
     * @description: 序列化编码
     * @author zp
     * @date: 2023/3/30 19:52
     */
    public abstract byte[] messageByteArrayEncode(Message message);

    /**
     * @description:  序列化解码
     * @author zp
     * @date: 2023/3/30 20:14
     * @param data
     * @return Message
     */
    public abstract Message messageByteArrayDecode(byte[] data);

    /**
     * @return byte[]
     * @description: 获取魔数
     * @author zp
     * @date: 2023/3/30 19:46
     */
    public byte[] getMagicNumber() {
        return new byte[]{1, 2};
    }

    /**
     * @return byte[]
     * @description: 获取版本号
     * @author zp
     * @date: 2023/3/30 19:47
     */
    public byte[] getVersion() {
        return new byte[]{1};
    }

    /**
     * @return byte[]
     * @description: 获取序列化算法
     * @author zp
     * @date: 2023/3/30 19:49
     */
    public byte[] getSerializationAlgorithm() {
        return new byte[]{0};
    }


}
